#ifndef __DYNAMICARRAY_H_
#define __DYNAMICARRAY_H_
#include<stddef.h>
#include<limits.h>
using ElementType=void *;
class  DynamicArray
{
public:
        DynamicArray();
        DynamicArray(const DynamicArray& a);
        DynamicArray& operator=(const DynamicArray& a);
        ~DynamicArray();

        void setfunc (void (*Free)(void*),bool(*Compare)(void*,void*), bool(*ComBig)(void*,void*),void(*Print)(void *))
        {
            this->Free=Free;
            this->Print=Print;
            this->Compare=Compare;
            this->ComBig=ComBig;
        }
        
      
        //插入
        //尾插法
        void Inserttail(const ElementType& element);
        //头插法
        void InsertHead(const ElementType&element);
        //中间插入
        void InsertByIndex(const ElementType&element,size_t index);


        //删除
        //按位置删除
        void RemoveByindex(size_t index);
        //按值删除
        void RemoveByelement(const ElementType&element);


        //查找
        //按位置查找
        ElementType* FindByIndex(size_t index);

        //按值查找
        //返回值：下标的集合
        DynamicArray FindByElement(const ElementType& element);

        //修改
        //按位置修改
        void UpdateByIndex(size_t index,const ElementType& newValue);
        //修改某个值
        void UpdateByElement(const ElementType&oldValue,const ElementType& newValue);

        ElementType& operator[](int index);//查找和修改统一在一个接口O(1)

        //排序算法
        void Sort();
        //去重算法
        void Duplicate();
        //合并算法
        DynamicArray Merge(const DynamicArray& a);
        //取交集
        DynamicArray FdInSctn(const DynamicArray& a);
        //取并集
        DynamicArray FindUnionset(const DynamicArray& a);
        //取补集
        DynamicArray FindDifference(const DynamicArray& a);


        //判断两个数列是否相等
        bool operator==(const DynamicArray&a);

        //二分法  没找到返回ULONG MAX
        size_t BinarySearch(const ElementType& element);

        //判断一个数列是不是另一个数列的子数列
        bool Contains(const DynamicArray& a);

        //获取子序列
        DynamicArray SubSquence(size_t index,size_t len);
        //判断一个数列是不是连续自数列
        bool ContinsContains(const DynamicArray& a);
        void show();
       

private:
    //分组
    size_t partition(size_t start,size_t end);
    void FastSort(size_t start,size_t end,size_t CurDepth, size_t maxDepth);
    void InsertSort(size_t start,size_t end);
    void ReSize(size_t capacity);
    ElementType *array;
    size_t capacity;
    size_t size;

    void(*Free)(void *);//释放对象的函数指针
    bool(*Compare)(void*,void*);
    bool(*ComBig)(void*,void*);//比较大小指针
    void(*Print)(void *);
};
















#endif